/* 
 * File:   HeadTable.h
 * Author: wx
 *频繁项集头表，存放的项目有按顺序排好的频繁项集，每个项集的链接
 * Created on 2009年12月20日, 下午3:48
 */

#ifndef _HEADTABLE_H
#define	_HEADTABLE_H

#include <map>
#include <vector>
#include "Transaction.h"
using namespace std;
#include "FPNode.h" 

class HeadTable
{
private:
    int threshold;
    vector<int> freqset;
    map<int,FPNode *> freqmap;
public:
    HeadTable(const vector<int> & v,int thres)
    {
        freqset = v;
        for(int i = 0;i < freqset.size();i++)
        {
            freqmap[freqset[i]]=NULL;
        }
    }

    HeadTable(const vector<Transaction> & st,int thres)
    {
        map<int,int> count;

        for(int i = 0;i < st.size();i++)
        {
            set<int> tmpset= st[i].getSet();
            set<int>::iterator si;
            for(si = tmpset.begin();si != tmpset.end();si++)
            {
                if(count.find(*si)!=count.end())
                {
                    map[*si]++;
                }
                else
                {
                    map[*si]=1;
                }
            }
        }

        //就是一个对序号排列的问题，咋就整不明白
        freqset = getFreq(count);
        for(int i = 0;i < freqset.size();i++)
        {
            freqmap[freqset[i]]=NULL;
        }
    }

    

    vector<int> getFreq()
    {
        return freqset;
    }

    void updateTable(FPNode * fp)
    {
        int item = fp->getItem();
        FPNode * head = freqmap[item];
        while( head->getNext() != NULL)
        {
            head = head->getNext();
        }
        head->setNext(fp);
    }

    FPNode * getHead(int i)
    {
        return freqmap[i];
    }

private:
    vector<int> getFreq(map<int,int> & m)
    {
        vector< pair<int,int> > vp;
        for(map<int,int>::iterator mi = m.begin();mi!= m.end();mi++)
        {
            vp.push_back(make_pair(mi->first,mi->second));
        }
        sort(vp.begin(),vp.end(),cmp);

        vector<int> result;
        for( int i = 0;i < vp.size();i++)
        {
            if(vp[i].second >= threshold)
            {
                result.push_back(vp[i].first);
            }
            else
                break;
        }
        return result;
    }

    //从大到小排序
    int cmp(const pair<int,int>& a, const pair<int,int>& b)
    {
        return a.second < b.second;
    }
};

#endif	/* _HEADTABLE_H */

